package config

import "github.com/zeromicro/go-zero/zrpc"

type Config struct {
	zrpc.RpcServerConf

	Env string

	// mysql config
	MysqlConf struct {
		Dev struct {
			DataSource string
		}
		Test struct {
			DataSource string
		}
		Prod struct {
			DataSource string
		}
	}

	// redis config
	RedisConf struct {
		Mode string
		Dev  struct {
			Single struct {
				Host     string
				Password string
				Db       uint8
			}

			Replication struct {
				Host     string
				Password string
				Db       uint8
			}

			Sentinel struct {
				Host       []string
				Password   string
				MasterName string
				Db         uint8
			}

			Cluster struct {
				Host     []string
				Password string
				Db       uint8
			}
		}
		Test struct {
			Single struct {
				Host     string
				Password string
				Db       uint8
			}

			Replication struct {
				Host     string
				Password string
				Db       uint8
			}

			Sentinel struct {
				Host       []string
				Password   string
				MasterName string
				Db         uint8
			}

			Cluster struct {
				Host     []string
				Password string
				Db       uint8
			}
		}
		Prod struct {
			Single struct {
				Host     string
				Password string
				Db       uint8
			}

			Replication struct {
				Host     string
				Password string
				Db       uint8
			}

			Sentinel struct {
				Host       []string
				Password   string
				MasterName string
				Db         uint8
			}

			Cluster struct {
				Host     []string
				Password string
				Db       uint8
			}
		}
	}

	// limiter config
	LimiterConf struct {
		Mode string
		// 全局限流器
		GlobalLimiter struct {
			// 时间段：1表示1秒钟，60表示60秒(1分钟)
			Period int
			// 次数
			Quota int

			// 每秒生成的令牌数
			Rate int

			// 令牌桶最大容量
			Burst int
		}

		// 用户限流器
		UserLimiter struct {
			// 时间段：1表示1秒钟，60表示60秒(1分钟)
			Period int
			// 次数
			Quota int

			// 每秒生成的令牌数
			Rate int

			// 令牌桶最大容量
			Burst int
		}

		// 关键操作限流器
		CriticalLimiter struct {
			// 时间段：1表示1秒钟，60表示60秒(1分钟)
			Period int
			// 次数
			Quota int

			// 每秒生成的令牌数
			Rate int

			// 令牌桶最大容量
			Burst int
		}
	}

	// limit func config
	LimitFuncConf []string
}
